<?php
/**
 * User: LRZ
 * Date: 2020/2/22
 * Time: 10:05
 */

/**
 *  892.三维形体的表面积
 *
 *  标签：几何、数学
 *
 *  在 N * N 的网格上，我们放置一些 1 * 1 * 1  的立方体。
 *  每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
 *  请你返回最终形体的表面积。
 *
 *  示例 1：
 *      输入：[[2]]
 *      输出：10
 *
 *  示例 2：
 *      输入：[[1,2],[3,4]]
 *      输出：34
 *
 *  示例 3：
 *      输入：[[1,0],[0,2]]
 *      输出：16
 *
 *  示例 4：
 *      输入：[[1,1,1],[1,0,1],[1,1,1]]
 *      输出：32
 *
 *  示例 5：
 *      输入：[[2,2,2],[2,1,2],[2,2,2]]
 *      输出：46
 *   
 *  提示：
 *      1 <= N <= 50
 *      0 <= grid[i][j] <= 50
 *
 *  来源：力扣（LeetCode）
 *  链接：https://leetcode-cn.com/problems/surface-area-of-3d-shapes
 *  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

$start = microtime(true);

$grid = [[3, 3, 3], [3, 4, 5], [5, 0, 4]];
$res  = surfaceArea($grid);

$end = microtime(true);
print_r($res);
printf(' total run: %.2f s<br>' . 'memory usage: %.2f M<br> ', $end - $start, memory_get_usage() / 1024 / 1024);

function surfaceArea($grid)
{
    $size = count($grid);
    $ans  = 0;
    foreach ($grid as $i => $iValue) {
        for ($j = 0; $j < $size; $j++) {
            if ($iValue[$j] !== 0) {
                $ans += $iValue[$j] * 4 + 2;
            }
            if ($i > 0) {
                $ans -= min($grid[$i - 1][$j], $iValue[$j]) * 2;
            }
            if ($j > 0) {
                $ans -= min($iValue[$j - 1], $iValue[$j]) * 2;
            }
        }
    }
    return $ans;
}